perm filename SCAN.FLD[NEW,LCS] blob
sn#319867 filedate 1977-12-14 generic text, type T, neo UTF8
00100 TITLE SCANR
00200 ENTRY SCANR,LNEND,STFNUM,RLOOP
00300 EXTERNAL SCN,SC,ALF,NALF,EXP3.2,SCX,SCM,RMOD
00400 ML←5 ↔ K←0 ↔ NNUM←14 ↔ ISKP←13 ↔ JJ←12 ↔ XMINUS←11 ↔ DECI←10
00500 M←7 ↔ N←6 ↔ QQ←4 ↔ TRIP←3
00600 DEFINE LL <SCN> ↔ DEFINE LR<SCN+1> ↔ DEFINE LBL <SCX+=15>
00700 DEFINE LSL <SCN+4> ↔ DEFINE LST <SCX+=11> ↔DEFINE LCM<SCX+4>
00800 DEFINE LE <SCN+5> ↔ DEFINE LC <SCN+6> ↔ DEFINE LS <SCN+7>
00900 DEFINE LPL<SCX+=10> ↔DEFINE LMI<SCX+5> ↔ DEFINE LF <SCN+=8>
01000 DEFINE LA <SCN+=9> ↔ DEFINE LI <SCN+=10> ↔ DEFINE LW <SCN+=11>
01100 DEFINE JN <SC+=10> ↔ DEFINE DBST <SC+=11> ↔ DEFINE ISEMI <SC+=14>
01200 DEFINE IXX <SC+=13> ↔ DEFINE MODE <SC+=70> ↔ DEFINE VX <SC+=16>
01300 DEFINE LU <SCN+2> ↔ DEFINE LD <SCN+3> ↔ DEFINE INP <ALF>
01400 DEFINE REXP<SC+6> ↔DEFINE DOT<SCX+6> ↔ DEFINE VX4 <SC+=19>
01500 ;; DEFINE STAFF<SCM+=80>
01600 IQ: BLOCK 12
01700 ; 00100 C SUBRS. SCANR, NALF, EDIT, PRESCN
01800 ; 00300 C ***** MSS SCANNER *************************
01900 ; 00400 SUBROUTINE SCANR
02000 ; 00500 DIMENSION IQ(10),LRUD(4)
02100 ; 00600 COMMON/ALF/INP(72),ML
02200 ;650 COMMON/SCN/LL,LR,LU,LD,LSL,LE,LC,LS,LF,LA,LI,LW
02300 ; COMMON/SCX/RHY(4),JALPHA(30),J4,L,Y,K,RX,RZ,RA,J5
02400 ; 00700 COMMON /SC/J,L,MK
02500 ; 00800 1 ,ISKP,XMINUS,N,REXP,LK,NNUM,JJ,JN,DBST,NFLG,IXX,ISEMI,QQ
02600 ; 00900 1 ,VX(50),IAMP,K,RRN,M,MODE,IBLA
02700 ;1000 EQUIVALENCE (IQ(1),VX(41)),(VX1,VX(1)),(VX2,VX(2)),(LDN,LRUD(4))
02800 ; 01100 DATA LRUD/'L','R','U','D'/
02900 ; 01200 C FOR LEFT, RIGHT, UP, DOWN, EDIT
03000 SCANR: 0
03100 MOVE ML,ALF+=72 ; 5 IS ML UNTIL RETURN
03200 SETOM NNUM ;1300 NNUM=-1
03300 SETZM ISKP ;1400 ISKP=0
03400 SETZM JJ ; 01500 JJ=0
03500 MOVSI XMINUS,201400 ; 01600 XMINUS=1.
03600 ; 01700 C LEAVES BLANK WHEN REST.
03700 ; 01800 999 DECI=-1
03800 S999: SETOM DECI ;INTEGER UNTIL S11!
03900 SETZM M ; 01900 M=0
04000 S2799: MOVE N,INP -1(ML) ; 02000 2799 N=INP(ML)
04100 S899: AOS ML ; 02100 899 ML=ML+1
04200 CAMN N,LSL ; 02200 781 IF(N.EQ.'/')N=ISEMI
04300 MOVE N,ISEMI
04400 ;2300 C FOR MOTIVIC TRANFORMATIONS
04500 CAME N,LST ;02380 IF(N.EQ.'*')GO TO 751
04600 CAMN N,ISEMI
04700 JRST S751 ; 02400 IF(N.EQ.ISEMI)GO TO 751
04800 ; 02500 C '*' AND '/' ADDED ABOVE 4/18/73
04900 CAMN N,IXX ; 02600 IF(N.NE.IXX)GO TO 22
05000 SKIPGE SC+=10 ; JN
05100 JRST S22 ; 02650 IF(JN)GO TO 22
05200 JUMPE ISKP,S210 ;02700 IF(ISKP.EQ.0)GO TO 210
05300 SOS ML ; 02800 ML=ML-1
05400 JRST S202 ; 02900 GO TO 202
05500 S22: CAMN N,LBL ;3000 22 IF(N.EQ.IBLA)GO TO 4702
05600 JRST S4702 ; 03050 IF(N.NE.',')GO TO 510
05700 CAME N,LCM
05800 JRST S510
05900 S4702: JUMPGE ISKP,S2799 ;3100 4702 IF(ISKP)202,2799,2799
06000 JRST S202 ; 03200 512 ML=ML+1
06100 S512: MOVE 2,ISEMI
06200 AOS ML ; 03300 IF(INP(ML).EQ.ISEMI)RETURN
06300 CAMN 02,INP -1(ML)
06400 JRST SEND
06500 JRST S512+1 ; 03400 GO TO 512
06600 S510: MOVE 02,JN ;3600 510 IF(JN.GE.0)GO TO 173
06700 JUMPGE 02,S173
06800 MOVEI 02,1 ;3700 C SKIP(JN=+1) IF NOT COMING FROM 'EDIT'
06900 MOVEM 02,JN ; 03800 JN=1
07000 MOVEI 15,1 ; 03900 DO 702 K=1,4
07100 S702: CAMN N,SCN -1(15) ;4000 702 IF(N.EQ.LRUD(K))GO TO 703
07200 JRST S703
07300 CAIGE 15,4
07400 CAIGE 15,4
07500 AOJA 15,S702 ; 04100 C FINDS L, R, U, D
07600 ; 04200 C YOU CAN TYPE THE FULL WORD
07700 ; 04300 703 JJ=JJ+1
07800 S703: AOS JJ
07900 MOVE K,15 ; 04400 IF(K.NE.4)GO TO 77
08000 CAIE K,4
08100 JRST S77 ; 04450 IF(INP(ML).EQ.'E')K=99
08200 MOVE 2,LE
08300 CAMN 2,INP-1(ML)
08400 MOVEI K,=99 ; 04500 C 'DE'=DELETE
08500 ; 04600 77 IF(N.EQ.'E')K=55
08600 S77: CAMN N,LE
08700 MOVEI K,=55 ; 04700 C 'E'= EDIT
08800 CAMN N,LC ; 04800 IF(N.EQ.'C')K=2222
08900 MOVEI K,=2222 ; COPY 04900 IF(N.EQ.IXX)K=222
09000 CAMN N,IXX ; EXIT
09100 MOVEI K,=222 ;05000 C 'C'=COPY, 'X'=EXIT FROM EDIT MODE
09200 FLTR K,K ; 05100 VX(JJ)=K
09300 MOVEM K,VX-1(JJ) ;05200 704 IF(INP(ML).EQ.IBLA)GO TO 2799
09400 S704: SKIPL INP-1(ML) ;IF(INP(ML).GT.0)GO TO 2799
09500 JRST S2799 ; IF NEXT CHAR. IS A LETTER(NEG.), SKIP IT.
09600 ; 05300 C PUT COMMA ERASER IN SCX.
09700 AOJA ML,S704 ;05400 ML=ML+1
09800 ; 05500 C SO IT WILL SKIP 'D' AND 'EL' IN 'EDIT' AND 'DEL'
09900 ; GO TO 704
10000 S173: JSA 16,NALF ; 05700 173 K=NALF(N)
10100 JUMP N ; 0 IS K
10200 JUMPG N,S1410 ;05800 IF(N.GT.0)GO TO 1410
10300 CAIN =18 ;5810 --R-- IF(K.EQ.18)GO TO 73
10400 JRST S73
10500 MOVEI 02,2 ; 05815 C JUMP IF A REST OR OTHER R'S
10600 CAMN 02,MODE ; 05820 IF(MODE.EQ.2)GO TO 144
10700 JRST S144
10800 ;YOU CAN TYPE 'S', ETC., FOR SIXTEENTH ETC., RHYTHM.
10900 ; JUMP IF NOT A LETTER
11000
11100 ; notes = 1xyz.0 x=accidental, yz=note num., negative=chord note
11200 ; rest = 2xyz.0 z=0=ordinary, =1=invis., =2=whole, =3=repeat bar
11300 ; =4=down, =5=up, -2xyz=num. of meas. rest
11400 ; clefs = 3xyz.0 z=0=treble, =1=bass, =2=alto, =3=tenor, neg.=invis.
11500 ; bars = 4xyz.0 z=num. of staves up, neg.=dbl.bar
11600 ; ksig = 17xyz.0 z=num. of accis., pos.=#, neg.=b, x=1 for naturals.
11700 ; meter = 18xyz.n xy=top num, zn=bottom num (DONE IN SCMSS)
11800 ; stem = 5xyz.0 YZ=10=stem up, =20=stem down
11900 ; staff = 5xyz.0 z=0=return to norm., =1=lower stf., =2=upper stf.
12000
12100 CAIGE =8 ;6100 --H-- IF(K.LT.8)GO TO 15
12200 JRST S15 ;06200 C JUMP IF A POSSIBLE NOTE
12300 CAIE =11 ;6300 --K-- IF(K.NE.11)GO TO 16
12400 JRST S16 ;06400 C JUMP IF NOT A KSIG
12500 MOVE QQ,[17000.0] ;QQ=17000 **** KEY SIGS ***
12600 S18: MOVE N,INP-1(ML) ;6500 18 N=INP(ML)
12700 AOS ML ; 06600 ML=ML+1
12800 CAMN N,LBL ;IF(N.EQ.IBLA)GO TO 18
12900 JRST S18
13000 CAME N,[ASCIZ/N /] ; IS IT AN N? K3FN/ OR K2SN/ MAKES NATURALS
13100 JRST S200 ;IF NEXT CHAR='N' A 'NATURALS' KEY SIG.
13200 MOVE 2,[100.0]
13300 SKIPG QQ
13400 MOVNS 2
13500 FADR QQ,2
13600 JRST S18
13700 S200: CAME N,LS ; 06750 IF(N.EQ.'S')GO TO 18
13800 CAMN N,LPL ; 06775 IF(N.EQ.'+')GO TO 18
13900 JRST S18 ; 06800 IF(N.EQ.ISEMI)GO TO 20
14000 CAMN N,ISEMI
14100 JRST S20 ; 06900 IF(N.EQ.'-')N='F'
14200 CAMN N,LMI
14300 JRST .+3 ;6950 IF(N.NE.'F')GO TO 18
14400 CAME N,LF
14500 JRST S19 ; 07200 19 A=NALF(N)
14600 MOVNS QQ ;NEG. FOR FLATS
14700 JRST S18 ;GO BACK AND LOOK AGAIN
14800 S19: JSA 16,NALF
14900 JUMP N
15000 FLTR K,K ;TLC K,232000
15100 JRST S18
15200 S20: JUMPL QQ,.+3
15300 FADR QQ,K
15400 SKIPA
15500 FSBR QQ,K ;07400 20 VX(1)=(17000.+A)*XMINUS
15600 MOVEM QQ,VX ;07500 KSIG
15700 JRST SEND ; 07600 RETURN
15800 S16: CAIE =9 ;-- I -- 7700 16 IF(K.NE.9)GO TO 2
15900 JRST S2
16000 MOVSI 02,205540 ; 07800 VX(1)=22.
16100 MOVEM 02,VX ; 07900 C FOR EDIT I21 ETC.
16200 JRST S2799 ;8000 GO TO 2799
16300 S2: CAIE =13 ; -- M -- 08100 2 IF(K.NE.13)GO TO 3
16400 JRST S3 ;8200 C JUMP IF NOT A MEASURE LINE
16500 ;; MOVSI 02,214764 ; ***** BARS =4000 ******
16550 MOVE 2,[4001.0] ; THE 1 IS FOR BAR ONE STAFF ONLY.
16600 MM: MOVE 1,INP -1(ML) ;08310 MM: JN=INP(ML)
16700 MOVEM 1,JN
16800 ;; CAME 1,LD ; 08320 IF(JN.NE.LD)GO TO 23
16900 ;; JRST S23
16910 CAMN 1,LD ; IF (JN.EQ.LD)GO TO MD
16920 JRST MD
16930 CAME 1,[-=27245141952] ;IF (JN.NE.'M')GO TO 23
16940 JRST S23
16950 FADR 2,[1.0] ;VX(1)=VX(1)+1 GO TO MM
16960 AOJA ML,MM ; GO BACK AND LOOK FOR MORE M'S ML=ML+1
17000 MD: AOS ML ;8330 ML=ML+1
17100 ; FOUND 'MDN' -- FOR DOUBLE BARS
17200 SETZM JN ;8350 JN=0
17300 MOVNS 02 ;DBL BARS ARE NEG.
17400 S23: MOVEM 02,VX
17500 JSA 16,NALF
17600 JUMP INP-1(ML) ;8400 23 K=NALF(INP(ML))
17700 JUMPLE K,S512 ; 08500 IF(K.LE.0)GO TO 512
17800 CAILE =9 ; 08505 IF(K.GT.9)GO TO 512
17900 JRST S512 ;NO MORE THAN 8 STAVES UP ALLOWED.
17950 SOJ K, ;K=K-1 BECAUSE ORIG. NUM WAS 4001, NOT 4000
18000 SKIPN JN ;8510 OLD CODE HERE! IF(JN.EQ.0)K=K+10
18100 MOVNS K ;NEG. IF DBL BAR
18200 FLTR K,K
18300 FADRM K,VX ;08600 C 'M2'= A BAR LINE UP 2 STAVES. ETC.
18400 JRST S512 ; 08700 GO TO 512
18500 S3: CAILE =16 ;-- P -- 08800 3 IF(K.GT.16)GO TO 4
18600 JRST S4 ; 08900 C JUMP IF NOT FOR 'PROXIMITY' MODE
18700 SUBI =15 ; 09000 NSWCH=K-15
18800 MOVEM K,NSWCH#
18900 JRST S2799 ; 09100 GO TO 2799
19000 ; TO SWITCH ALWAYS USE OCT.# /PBF4/ /OE5/ P=PROXIMITY, O=ORDINARY
19100 S4: CAIE =20 ; 09500 4 IF(K.NE.20)GO TO 21
19200 JRST S21 ; 09600 C TRY AGAIN IF NOT A 'T'
19300 MOVE 3,INP -1(ML) ;09700 IF(INP(ML).GT.0)GO TO 2799
19400 JUMPG 3,S2799;T12,8/ ETC. MAKES A METR, OR TIM SIG. POS NUMS AREN'T LETRS!
19500 MOVSI 02,214567 ; ***** CLEFS = 3000 ***** CODE 3.
19600 CAMN 3,LE
19700 FADR 2,[3.0] ; TENOR CLEF =3003, TREBLE=3000
19800 JRST SCLEF ; 10100 GO TO SCLEF
19900 S21: CAIE =19 ; -- S -- 10200 21 IF(K.NE.19)GO TO 899
20000 JRST S2799 ;NOT AN 'S'(STEM), UNKNOWN ITEM, SKIP IT.
20100 MOVE 2,INP-1(ML) ;10600 IF(INP(ML).EQ.LDN)VX(1)=5020.
20200 MOVE 03,[5000.0] ; SU UP=5010
20300 CAMN 2,LU
20400 FADR 3,[10.0]
20500 CAMN 2,LD
20600 FADR 3,[20.0] ; DOWN = 5020
20700 CAMN 2,LPL ;IF( .EQ.'+') S+=5002
20800 FADR 3,[2.0]
20900 CAMN 2,LMI ;IF( .EQ.'-') S-=5001
21000 FADR 3,[1.0] ; IF( .EQ.'0') S0=5000
21100 ;THESE ARE FOR S+, S-, S0; PUT NOTE ON OTHER STF.
21200 MOVEM 03,VX
21300 JRST S512 ; 10700 GO TO 512
21400 S15: MOVE N,INP -1(ML) ; 11100 N=INP(ML)
21500 CAIN K,2 ;IF(1ST LETR.NE.'B')GO TO S5
21600 CAME N,LA ; 11200 IF(N.NE.'A')GO TO 5
21700 JRST S5 ; 11300 C JUMP IF NOT BASS CLEF
21800 MOVE 02,[3001.0] ;BASS CLEF=3001
21900 SCLEF: MOVEM 02,VX
22000 SKIPGE XMINUS ; 11500 51 IF(XMINUS)VX(1)=-VX(1)
22100 MOVNS VX ;11600 TYPE '-BA' FOR INVISIBLE BASS CLEF, ETC.
22200 JRST S512
22300 S5: CAME N,LL ; 11800 5 IF(N.NE.'L')GO TO 6
22400 JRST S6 ; 11900 JUMP IF NOT ALTO CLEF
22500 MOVE 02,[3002.0]
22600 JRST SCLEF
22700 S6: SUBI 2 ; -2 BECAUSE MUSICAL ALPHABET STARTS WITH C
22800 SKIPG
22900 ADDI 7
23000 MOVE NNUM,K ; K IS AC0
23100 MOVEI QQ,=1000
23200 MOVEI K,1 ;6 K=1
23300 CAILE NNUM,3 ; 12300 IF(NNUM.GT.3)K=2
23400 AOJ K, ;12500 C FOUND A NOTE
23500 CAMN N,IXX ; 12700 IF(N.EQ.IXX)GO TO 5410
23600 JRST S5410 ; 12800 C FOR GX3/ ETC.
23700
23800 CAME N,INP-2(ML) ;IF(N.NE.INP(ML))GO TO SS6
23900 JRST SS6 ; NO DOUBLE-LETTER ACCID. (FLAT)
24000 CAME N,INP(ML) ;IF(N.NE.INP(ML+1))GO TO S8-2
24100 JRST S8-2 ;NO TRIPLE-LETTER ACCID. (SHARP)
24200 AOS ML ;ML=ML+1
24300 CAME N,INP(ML) ;IF(N.NE.INP(ML+1))GO TO S8
24400 JRST S8 ;NO TRIPLE-LETTER ACCID. (NATURAL)
24500 AOS ML ;ML=ML+1
24600 MOVEI QQ,=1300 ;TYPE AA FOR AF, AAA = AS, AAAA = AN
24700 JRST S610
24800
24900 SS6: JSA 16,NALF ; 12900 K=NALF(N)
25000 JUMP N
25100 JUMPG N,S7 ;13000 IF(N.GT.0)GO TO 7
25200 ;13100 C JUMP IF NOT A LETTER
25300 MOVEI QQ,=1300 ; ***** NOTES ***** =1000 2ND DIG=ACCI.
25400 CAIN =14 ; --N-- 13300 IF(K.EQ.14)GO TO 610
25500 JRST S610 ; 13500 C JUMP IF NATURAL
25600 CAIN =19 ; -- S -- 13400 IF(K.EQ.19)GO TO 8
25700 JRST S8
25800 MOVEI QQ,=1100 ; IT'S A FLAT
25900 JRST S610
26000 S8: MOVEI QQ,=1200 ; SHARP =1200
26100 S610: AOS ML ; 14100 610 ML=ML+1
26200 JSA 16,NALF ;14200 K=NALF(INP(ML))
26300 JUMP INP-1(ML)
26400 SKIPL INP-1(ML) ;IF CHAR. ISN'T A LETTER, GO TO S7
26500 JRST S7 ; (LETTERS ARE NEG., NUMBS ARE POS.)
26600 CAIE =19 ;IF(K.EQ.19) THEN IT'S SS
26700 JRST .+3 ;FOR DBL FLAT, DBL SHARP
26800 MOVEI QQ,=1500 ;DBL FLAT
26900 JRST S610
27000 CAIE 6 ;IS IT 'FF'?
27100 JRST S7
27200 MOVEI QQ,=1400 ;FF=1400, SS=1500
27300 JRST S610 ; GO BACK FOR ANOTHER CHAR.
27400 S7: CAIN =11 ;-- K -- ??? 14300 7 IF(K.EQ.11)GO TO 5410
27500 JRST S5410
27600 JUMPL K,S5410 ; 14350 IF(K.LT.0)GO TO 5410
27700 ;14400 C JUMP IF SEMICOLON OR BLANK
27800 CAIN =24 ;-- X --14500 IF(K.NE.24)GO TO 24
27900 JRST S5410 ; 14800 24 JSCA=K-1
28000 S24: MOVEM K,JSCA# ; SAVE OCT. NUM
28100 AOS ML ; 14900 ML=ML+1
28200 JRST S2410
28300 S5410: SKIPN NSWCH ;15300 5410 IF(NSWCH.EQ.0)GO TO 2410
28400 JRST S2410
28500 MOVN JJ,NNUM ; 15910 7410 JJ=NOLD-NNUM
28600 ADD JJ,NOLD
28700 CAIL JJ,4 ; 15920 IF(JJ.LT.4)GO TO 377
28800 AOS JSCA
28900 CAMG JJ,[-4] ; 16010 377 IF(JJ.GT.-4)GO TO 2410
29000 SOS JSCA
29100 ;WILL JUMP TO NEAREST NOTE (DIATONIC-'75)
29200 S2410: MOVEI JJ,1 ; 16200 2410 JJ=1
29300 SETZM VX+1 ; 16300 VX2=0
29400 MOVE 2,JSCA ;VX1=(1000+ACCI*100+OCT*7+NNUM)*DBST
29500 IMULI 2,7
29600 ADD 2,NNUM
29700 ADD 2,QQ ; ADD 1000+OCT*7 (QQ)
29800 FLTR 2,2
29900 FMPR 2,DBST
30000 MOVEM 2,VX ; 16500 C DOUBLE STOPS ARE NEG. NUMBERS
30100 MOVEM NNUM,NOLD# ; 16600 NOLD=NNUM
30200 ;; ?S4410: MOVNI NNUM,2 ;16700 4410 NNUM=-2
30300 S4410: MOVE 02,ISEMI ;16800 IF(INP(ML).EQ.ISEMI)RETURN
30400 CAMN 02,INP -1(ML)
30500 JRST SEND
30600 ;ABOVE FINDS SCALE NOTES; IF NSWCH=0 OCT. NUM WILL STICK UNTIL RESET
30700 JRST S310
30800 S210: AOS JJ ; 17100 210 JJ=JJ+1
30900 CAIN JJ,1 ; 17200 IF(JJ.EQ.1)GO TO 3310
31000 JRST S3310
31100 MOVSI XMINUS,201400 ; 17300 XMINUS=1.
31200 SETZM VX -1(JJ) ; 17400 VX(JJ)=0
31300 ; 'X N1,N2' MAY REPLACE 'REP N1,N2'. N2=0 BECOMES N2=2
31400 JRST S310 ; 17800 C JUMP IF A LETTER
31500 S1410: MOVE MODE ; 17900 1410 IF(N.NE.'-')GO TO 14
31600 CAME N,LMI
31700 JRST S544
31800 MOVN XMINUS,[1.0] ; 18000 XMINUS=-1.
31900 JUMPE JJ,S2799 ; IF(JJ.EQ.0)GO TO 2799 -- FOR '-BA' ETC.
32000 CAIN 1
32100 JRST S644 ; IF(MODE.EQ.1)GO TO 644 [FOR AUTO OCT. SYS.]
32200 JRST S2799 ; 18100 GO TO 2799
32300 S544: CAIN 1 ; IF(N.NE.'+')GO TO 14
32400 CAME N,LPL
32500 JRST S14
32600 S644: MOVSI 7,203700 ; [7.0] DEFAULT IS OCTAVE. (+ OR - 7)
32700 JSA 16,NALF
32800 JUMP ALF-1(ML) ;THE NEXT CHARACTER.
32900 CAIG =9
33000 SKIPG
33100 JRST S744 ;NEXT IS NOT A NUMB.
33200 FLTR 7,0 ;MOVE 7,0
33300 AOJ ML,
33400 S744: CAME N,LPL
33500 MOVNS 7
33600 MOVEM 7,VX4 ; SEND IT TO SCMSS -- AT 71
33700 JRST S2799
33800
33900 ; 18102 144 TRIP=0
34000 S144: SETZM TRIP
34100 ; 18105 444 IF(K.EQ.8)VX1=2
34200 S444: CAIE =8
34300 JRST .+3
34400 MOVSI 2,202400
34500 JRST SVX
34600 CAIE 4 ;18107 IF(K.EQ.4)VX1=.5
34700 JRST .+3
34800 MOVSI 2,200400
34900 JRST SVX
35000 CAIE 5 ; 18110 IF(K.EQ.5)VX1=8
35100 JRST .+3
35200 MOVSI 02,204400
35300 JRST SVX
35400 CAIE 7 ; 18115 IF(K.EQ.7)VX1=88
35500 JRST .+3
35600 MOVSI 02,207540
35700 JRST SVX
35800 CAIE =19 ; 18120 IF(K.EQ.19)VX1=16
35900 JRST .+3
36000 MOVSI 02,205400
36100 JRST SVX
36200 CAIE =20 ; 18125 IF(K.NE.20)GO TO 244
36300 JRST S244
36400 MOVSI 02,204600 ; 18126 VX1=12
36500 MOVE N,INP -1(ML) ; 18127 N=INP(ML)
36600 CAME N,LBL ; 18129 IF(N.EQ.LBL)GO TO 344
36700 CAMN N,ISEMI
36800 ;; JRST S344 ; 18131 IF(N.EQ.ISEMI)GO TO 344
36900 JRST SVX
37000 CAMN N,IXX ; IF(N.EQ.IXX)GO TO SVX
37100 JRST SVX
37200 MOVSI TRIP,576400 ; 18133 TRIP=-1
37300 AOS ML ; 18150 ML=ML+1
37400 JSA 16,NALF ; 18155 K=NALF(N)
37500 JUMP N
37600 MOVE N,INP-1(ML) ; N=INP(ML) *******
37700 JRST S444 ; 18160 GO TO 444
37800 S244: CAIE =23 ; 18220 244 IF(K.EQ.23)VX1=1
37900 JRST .+3
38000 MOVSI 02,201400
38100 JRST .+4
38200 CAIE =17 ; 18222 IF(K.EQ.17)VX1=4
38300 JRST .+3
38400 MOVSI 02,203400
38500 SVX: MOVEM 02,VX ; 18223 C TS=24TH, TQ=6, TH=3.
38600 ; FOR S,E,Q,H,W,D,T RHYTH. 'T'(K=20) =TRIPLET D=DBL WHL NOTE
38700 JUMPGE TRIP,S344 ;18225 IF(TRIP)VX1=VX1*1.5
38800 MOVSI 2,201600
38900 FMPRM 02,VX
39000 S344: AOS JJ ; 18226 344 JJ=JJ+1
39100 JRST S1310
39200
39300 S14: SETOM ISKP ; 18230 14 ISKP=-1
39400 CAME N,DOT ; 18300 IF(N.NE.'.')GO TO 79
39500 JRST S79
39600 MOVE DECI,M ; 18400 DECI=M
39700 JRST S75
39800 S79: AOS M ; 18600 79 M=M+1
39900 JSA 16,NALF ;18700 IQ(M)=NALF(N)
40000 JUMP N
40100 MOVEM 00,IQ -1(M)
40200
40300 S75: CAMN N,ISEMI ;18900 75 IF(N.EQ.ISEMI)GO TO 751
40400 JRST S751
40500 MOVEI 02,1 ; 18950 IF(INP(ML).NE.1)GO TO 2799
40600 CAME 02,INP -1(ML)
40700 JRST S2799
40800 S751: JUMPE ISKP,SEND ; 19000 751 IF(ISKP.EQ.0)RETURN
40900 S202: CAME DECI,[-1] ; 19100 202 IF(DECI.NE.-1)GO TO 302
41000 JRST S302
41100
41200 SETZM DECI ; 19200 DECI=0
41300
41400 JRST S402
41500
41600 S302: SUB DECI,M ; 19400 302 DECI=M-DECI
41700 MOVNS DECI ; 19500 402 RRN=0
41800 S402: SETZM RRN# ; 19600 REXP=M-1
41900 MOVNI 02,1
42000 ADD 02,M
42100 FLTR 2,2 ;TLC 2,232000
42200 ;; FADR 2,2
42300 MOVEM 2,REXP ; 19700 IF(M.LT.1)M=1
42400 CAIGE M,1
42500 MOVEI M,1 ; 19800 DO 171 K=1,M
42600 MOVEI QQ,1 ;USE QQ FOR INDEX
42700 ; 19900 IF(REXP.GT.1)GO TO 1
42800 S171: MOVSI 02,201400
42900 CAMGE 02,REXP
43000 JRST S1 ; 20000 RRV=10
43100 MOVSI 02,204500 ; RRV IS IN 2
43200 ; 20100 IF(REXP.EQ.0)RRV=1
43300 SKIPN REXP
43400 MOVSI 02,201400
43500 JRST S11 ; 20300 1 RRV=10.**REXP
43600 S1: MOVSI 02,204500
43700 MOVE 03,REXP
43800 PUSHJ 17,EXP3.2 ;20400 11 RRN=RRN+IQ(K)*RRV
43900 S11: FLTR 3,IQ-1(QQ) ;MOVE 3,IQ-1(QQ)
44000 FMPR 2,3
44100 FADRM 2,RRN ; 20500 171 REXP=REXP-1
44200 MOVSI 02,576400
44300 FADRM 02,REXP
44400 CAMGE QQ,M
44500 AOJA QQ,S171
44600 JUMPE DECI,.+6
44700 FLTR DECI,DECI ;TLC DECI,232000
44800 ; 20600 A=10.**DECI
44900 MOVSI 02,204500
45000 MOVE 03,DECI
45100 PUSHJ 17,EXP3.2 ; A WILL BE IN AC2
45200 ; 20700 IF(DECI.EQ.0)A=1.
45300 SKIPA
45400 MOVSI 02,201400 ; 20800 JJ=JJ+1
45500 AOS JJ ; 20900 VX(JJ)=RRN/A*XMINUS
45600 MOVE 1,RRN
45700 FDVR 1,2
45800 FMPR 1,XMINUS
45900 MOVEM 1,VX -1(JJ) ; 21000 JN=-JN
46000 MOVNS 00,JN ;21100 C SETS IT TO -1 FOR L,R,U,D EDIT ROUTINE
46100 MOVEI 02,2 ; 21200 IF(MODE.NE.2)XMINUS=1.
46200 CAME 02,MODE
46300 MOVMS XMINUS ; 21300 C************: MODE #?
46400 ; 21400 C ONLY ONE - NEEDED FOR RHY.COMPOSITE
46500 ; 21500 1310 IF(INP(ML).NE.1)GO TO 310
46600 S1310: MOVEI 3,1
46700 CAME 3,INP -1(ML)
46800 JRST S310 ;21600 VX(JJ+1)=VX(JJ)*2. ; FOR DOTTED RHYTHMS
46900 MOVE 02,VX -1(JJ)
47000 FSC 02,1
47100 MOVEM 02,VX (JJ) ; 21700 JJ=JJ+1
47200 AOS JJ ; 21800 ML=ML+1
47300 AOS ML
47400 JRST S1310 +1 ; 22000 206 ML=ML+2
47500 S206: ADDI ML,2 ; 22100 3310 VX(1)=-99.
47600 S3310: MOVN 02,[99.0]
47700 MOVEM 02,VX ; 22200 310 ISKP=0
47800 S310: SETZM ISKP ; 22300 IF(N.NE.ISEMI)GO TO 999
47900 CAME N,ISEMI
48000 JRST S999 ; 22500 RETURN
48100 SEND: MOVEM ML,ALF+=72
48200 MOVEM JJ,SC+=9
48300 JRA 16,(16) ; 22600 73 JJ=JJ+1
48400 S73: AOS JJ ; 22650 K=INP(ML)
48500 MOVE K,INP -1(ML) ;22700 IF(K.EQ.'E')GO TO 206
48600 CAMN K,LE
48700 JRST S206 ; NEXT IS FOR A REST/R/ OR /RI/ FOR INVIS. REST
48800 ; 22810 IF(K.EQ.'D')GO TO 1073
48900 CAMN K,LD
49000 JRST S1073
49100 ; /RD/ OR /RU/ = REST 6 DOWN OR 6 UP.
49200 ; 22830 IF(K.EQ.'U')GO TO 1173
49300 CAMN K,LU
49400 JRST S1173 ; 22900 IF(K.EQ.'I')GO TO 573
49500 CAMN K,LI
49600 JRST S573 ; 22910 IF(K.EQ.'W')GO TO 273
49700 CAMN K,LW
49800 JRST S273
49900 ; /RW/ MAKES WHOLE REST REGARDLESS OF TIME VALUE GIVEN.
50000 CAMN K,LR ;IF(K.EQ.'R')GO TO 1273
50100 JRST S1273 ; /RR/ MAKES REPEAT BAR SIGN (REST=-4)
50200
50300 ; *** ADD NUMBERS LATER *****; 22932 K=NALF(K)
50400 JSA 16,NALF
50500 JUMP K ; 22934 IF(K)GO TO 673
50600 JUMPL K,S673 ; 22936 IF(K.GE.10)GO TO 673
50700 CAIL =10
50800 JRST S673 ; 22940 973 KV=NALF(INP(ML+1))
50900 S973: MOVE 15,K
51000 JSA 16,NALF
51100 JUMP INP(ML)
51200 ; FOR 3-DIG. NUMBS. CAN TAKE NUM UP TO 999 FOR RESTS.
51300 ; 22942 IF(KV)GO TO 873
51400 JUMPL S873 ;22944 IF(KV.GE.10)GO TO 873
51500 CAIL =10
51600 JRST S873 ; 22945 ML=ML+1
51700 AOS ML ; 22946 K=K*10+KV
51800 IMULI 15,=10
51900 IMUL 02,K
52000 ADD 15,K ; 15 IS K FOR NOW AND K IS IV
52100 JRST S973+1
52200
52300 S873: ADDI 15,=2000 ; QQ IS AC15 NOW. RW =2002
52400 MOVNS 15
52500 FLTR 15,15 ;TLC 15,232000
52600 JRST S473
52700 S673: MOVSI 15,213764 ;QQ=2000
52800 JRST S373 ;ORDINARY REST
52900 S573: MOVE 15,[2001.0] ;INVISIBLE REST
53000 JRST S473
53100 S273: MOVE 15,[2002.0] ;WHOLE REST (NO MATTER WHAT RHYTH.]
53200 S473: AOS ML ; 22990 473 ML=ML+1
53300 S373: MOVEM 15,VX-1(JJ) ; 23000 373 VX(JJ)=QQ
53400 JRST S4410
53500 S1073: MOVSI 15,213765 ;RD = REST DONW 2004
53600 JRST S473
53700 S1173: MOVE 15,[2005.0] ;RU = REST UP 2005
53800 JRST S473
53900 S1273: MOVE 15,[2003.0] ;RR = BAR REPEAT SIGN
54000 JRST S473 ; FOR /RR/
54100 ;23400 END
54200 LNEND: 0 ;SEE FORTR. TEXT IN WORDS.F4
54300 MOVE 0,SCX+=11 ; *
54400 MOVE 1,SCX+=13 ; ;
54500 MOVE 2,SCN+4 ; /
54600 MOVEI 3,=71
54700 L2901: CAME 2,ALF(3)
54800 JRST L2903
54900 MOVEM 1,ALF(3)
55000 JRA 16,(16)
55100 L2903: CAME 1,ALF(3)
55200 JRST L2902
55300 MOVEM 0,ALF(3)
55400 JRA 16,(16)
55500 L2902: SKIPLE 3
55600 SOJA 3,L2901
55700 JRA 16,(16)
55800
55900 STFNUM: 0 ;FUNCTION STFNUM(STAFF)
56000 SETOM SCANR ;SCANR=-1 FLAG
56100 SETZ 6,
56200 STFN1: MOVE 2,INP(6)
56300 MOVE 4,INP+1(6)
56400 CAME 2,LS ;IS INP1='S'?
56500 JRST NONUM
56600 CAME 4,[ASCIZ/T /] ; IF(INP(2).EQ.'T')STAFF=NEXT NUM
56700 CAMN 4,[ASCIZ/P /] ; IS IT A P?
56800 SKIPA
56900 JRST NONUM ;NO
57000 MOVE 3,[ASCIZ/Z /] ;PUT Z'S INTO FIRST LOCS.
57100 MOVE ML,6 ;ML=3+PTR
57200 ADDI ML,3
57300 MOVSI XMINUS,201400
57400 MOVE 2,INP+2(6) ;LOOK AT 3RD CHAR.
57500 CAME 2,LMI ;IS IT MINUS?
57600 JRST .+3
57700 MOVNS XMINUS
57800 AOJ ML, ;ML=ML+1
57900 JSA 16,NALF ;GET THE STAFF NUM.
58000 JUMP INP-1(ML)
58100 FLTR
58200 FMPR XMINUS
58300 CAME 4,[ASCIZ/P /] ;IF NOT 'P' GO TO STFN2
58400 JRST STFN2
58500 SETOM SCX+=34 ;RB=-1
58600 MOVEM RMOD+1 ;SET4 IS NOW FILLED
58700 JRST STFN3-1
58800 STFN2: SETZM SCX+=34 ;RB=0
58900 MOVEM @(16) ;TYPE STn/ TO SET STAFF NUM FOR ENTIRE LINE.
59000 MOVE ML,6
59100 STFN3: MOVE 2,INP(ML) ;LOOK FOR THE SLASH AND THROW ALL AWAY
59200 MOVEM 3,INP(ML) ;SKIP UNTIL SEMI (CHANGED FROM SLASH AT S899)
59300 AOJ ML,
59400 CAME 2,LSL
59500 JRST STFN3
59600 SETZM SCANR ;RETURN A ZERO
59700 MOVE 6,ML
59800 JRST STFN1 ;GO BACK AND LOOK FOR MORE.
59900 NONUM: MOVE SCANR ;NO STAFF NUM, RETURN A -1
60000 JRA 16,1(16)
60100
60200 RLOOP: 0 ;CALL RLOOP(A,B,K)
60300 HRLI 1,@1(16) ;DIMENSION A(1),B(1) -- SOURCE
60400 HRRI 1,@(16) ;DO 1 J=1,K -- DESTINATION
60500 MOVE 2,(16) ;1 A(J)=B(J) -- WORD COUNT
60600 ADD 2,@2(16) ;LOC OF ARRAY A + WDCNT.
60700 BLT 1,-1(2)
60800 JRA 16,3(16)
60900 END